/**
 * API Key 存储管理
 * 专门用于处理API Key的安全存储、获取和验证
 */

// API Key 存储键名常量
const API_KEY_STORAGE_KEY = 'zhihuipu_api_key';
const API_KEY_ENCRYPTION_FLAG = 'api_key_encrypted'; // 加密标志

// 从环境变量中获取API Key（如果配置了的话）
// 注意：在实际生产环境中，应该使用Vite的环境变量系统
// 这里只是一个示例实现，需要用户在.env文件中配置
let ENV_API_KEY: string | null = null;

// 尝试从全局配置中获取API Key
try {
  // 检查是否存在全局配置
  if (typeof window !== 'undefined' && (window as any).APP_CONFIG?.API_KEY) {
    ENV_API_KEY = (window as any).APP_CONFIG.API_KEY;
  }
} catch (error) {
  console.error('Failed to get API Key from environment:', error);
}

/**
 * 保存API Key到本地存储
 * @param apiKey 用户的API Key
 */
export function saveApiKey(apiKey: string): void {
  try {
    // 未来可以在这里添加加密逻辑
    localStorage.setItem(API_KEY_STORAGE_KEY, apiKey);
    localStorage.setItem(API_KEY_ENCRYPTION_FLAG, 'false'); // 标记是否已加密
  } catch (error) {
    console.error('Failed to save API Key to localStorage:', error);
    throw new Error('无法保存API Key，请检查浏览器存储权限');
  }
}

/**
 * 从本地存储获取API Key
 * @returns API Key字符串或null（如果不存在）
 */
export function getApiKey(): string | null {
  try {
    // 优先返回环境变量中的API Key
    if (ENV_API_KEY) {
      return ENV_API_KEY;
    }

    // 如果没有环境变量，则从localStorage获取
    const apiKey = localStorage.getItem(API_KEY_STORAGE_KEY);
    
    // 如果有API Key，检查是否需要解密
    if (apiKey) {
      const isEncrypted = localStorage.getItem(API_KEY_ENCRYPTION_FLAG) === 'true';
      
      // 未来可以在这里添加解密逻辑
      return apiKey;
    }
    
    return null;
  } catch (error) {
    console.error('Failed to get API Key from localStorage:', error);
    return null;
  }
}

/**
 * 删除存储的API Key
 */
export function removeApiKey(): void {
  try {
    localStorage.removeItem(API_KEY_STORAGE_KEY);
    localStorage.removeItem(API_KEY_ENCRYPTION_FLAG);
  } catch (error) {
    console.error('Failed to remove API Key from localStorage:', error);
    throw new Error('无法删除API Key，请检查浏览器存储权限');
  }
}

/**
 * 检查是否有有效的API Key
 * @returns 如果存在有效的API Key则返回true，否则返回false
 */
export function hasValidApiKey(): boolean {
  const apiKey = getApiKey();
  
  // 简单的验证逻辑：检查是否不为空且长度合理
  if (apiKey && apiKey.trim() !== '') {
    // 检查是否符合智谱AI API Key的格式特征（假设是长字符串，包含字母和数字）
    const isValidFormat = apiKey.length >= 20 && /^[a-zA-Z0-9]+$/.test(apiKey.replace(/[^a-zA-Z0-9]/g, ''));
    return isValidFormat;
  }
  
  return false;
}

/**
 * 验证API Key格式是否有效
 * @param apiKey 要验证的API Key
 * @returns 格式是否有效
 */
export function validateApiKeyFormat(apiKey: string): boolean {
  if (!apiKey || apiKey.trim() === '') {
    return false;
  }
  
  // 检查长度和字符组成
  return apiKey.length >= 20 && /^[a-zA-Z0-9]+$/.test(apiKey.replace(/[^a-zA-Z0-9]/g, ''));
}

/**
 * 安全地获取API Key的一部分（用于显示，避免暴露完整Key）
 * @returns 部分API Key字符串，如 "sk-abc****xyz"
 */
export function getMaskedApiKey(): string {
  const apiKey = getApiKey();
  
  if (!apiKey) {
    return '未设置';
  }
  
  // 只显示前几位和后几位，中间用星号隐藏
  const prefixLength = Math.min(5, Math.floor(apiKey.length / 4));
  const suffixLength = Math.min(5, Math.floor(apiKey.length / 4));
  
  if (apiKey.length <= prefixLength + suffixLength) {
    return '*'.repeat(apiKey.length);
  }
  
  const prefix = apiKey.substring(0, prefixLength);
  const suffix = apiKey.substring(apiKey.length - suffixLength);
  const masked = '*'.repeat(apiKey.length - prefixLength - suffixLength);
  
  return `${prefix}${masked}${suffix}`;
}

/**
 * 导出所有API Key相关函数，方便统一管理
 */
export const apiKeyManager = {
  saveApiKey,
  getApiKey,
  removeApiKey,
  hasValidApiKey,
  validateApiKeyFormat,
  getMaskedApiKey
};

export default apiKeyManager;